# 无序性
# 唯一性

# https://fishc.com.cn/thread-203569-1-1.html


print(type({}))  # <class 'dict'>
print(type({"one"}))  # <class 'set'>
print(type({"one": 1}))  # <class 'dict'>

# <class 'set'> 类型：集合，集合中所有元素都应该是独一无二的，并且也是无序的！

# 创建集合的方法

set1 = {"FishC", "Python"}
print(set1)  # {'Python', 'FishC'}
set2 = {x for x in "FishC"}
print(set2)  # {'s', 'i', 'F', 'h', 'C'}
# 使用类型构造器构建集合
set3 = set("FishC")
print(set3)  # {'h', 'C', 'i', 'F', 's'}

# 因为集合是无序的，所以我们无法使用下标的方式取读它的元素
# print(set3[0])  # TypeError: 'set' object is not subscriptable

# 但是 in 跟 not in 是可以使用的
print('C' in set3)  # True
print('哈哈' not in set3)  # True

# 使用迭代的方式取访问集合中的元素
for each in set3:
    print(each)
# h
# i
# F
# C
# s

# 唯一性
s = [1, 1, 2, 3, 5]
set_1 = set(s)
print(set_1)  # {1, 2, 3, 5} 传入2个1，只保留一个1
print(len(s) == len(set_1))  # False

# s.copy()	返回 s 集合的一个浅拷贝
# s.isdisjoint(other)	如果 s 集合中没有与 other 容器存在共同的元素，那么返回 True，否则返回 False
# s.issubset(other)	如果 s 集合是 other 容器的子集（注1），那么返回 True，否则返回 False
# s.issuperset(other)	如果 s 集合是 other 容器的超集（注2），那么返回 True，否则返回 False
# s.union(*others)	返回一个新集合，其内容是 s 集合与 others 容器的并集（注3）
# s.intersection(*others)	返回一个新集合，其内容是 s 集合与 others 容器的交集（注4）
# s.difference(*others)	返回一个新集合，其内容是存在于 s 集合中，但不存在于 others 容器中的元素（注5）
# s.symmetric_difference(other)	返回一个新集合，其内容是排除掉 s 集合和 other 容器中共有的元素后，剩余的所有元素
# 注1：对于两个集合 A、B，如果集合 A 中任意一个元素都是集合 B 中的元素，我们就说这两个集合有包含关系，称集合 A 为集合 B 的子集（Subset）。
# 注2：对于两个集合 A、B，如果集合 B 中任意一个元素都是集合 A 中的元素，我们就说这两个集合有包含关系，称集合 A 为集合 B 的超集（Superset）。
# 注3：对于两个集合 A、B，把他们所有的元素合并在一起组成的集合，叫做集合 A 与集合 B 的并集（Union）。
# 注4：对于两个集合 A、B，由所有属于集合 A 且属于集合 B 的元素所组成的集合，叫做集合 A 与集合 B 的交集（Intersection）。
# 注5：对于两个集合 A、B，由所有属于集合 A 且不属于集合 B 的元素所组成的集合，叫做集合 A 与集合 B 的差集（Difference）。
# 注6：others 参数表示支持多个容器（参数类型可以是集合，也可以是序列）；other 参数则表示单个容器。

this_set = {1, 2, 3, 5}
copy_set = this_set.copy()
print(copy_set)  # {1, 2, 3, 5}

other_set = set("FishC")
print(this_set.isdisjoint(other_set))  # True
print(other_set.isdisjoint(this_set))  # True
print(other_set.isdisjoint("JAVA"))  # True

print(this_set.issubset("1"))  # False
print(other_set.issubset("FishC.com.cn"))  # True
print(other_set.issuperset("Fish"))  # True

# 并集
print({1, 2}.union({2, 3, 4}))  # {1, 2, 3, 4}
print({1, 2}.union({2, 3, 4}, {5, 6, 7}))  # {1, 2, 3, 4, 5, 6, 7}

# 交集
print({1, 2}.intersection({2, 3, 4}))  # {2}

# 差集
print({1, 2}.difference({2, 3, 4}))  # {1}

# 对称差集
# symmetric：对称的
# symmetric_difference(other)	返回一个新集合，其内容是排除掉 s 集合和 other 容器中共有的元素后，剩余的所有元素
print({1, 2}.symmetric_difference({2, 3, 4}))  # {1, 3, 4}

s = set("FishC")

# s 是不是 FishC 的子集
print(s <= set("FishC"))  # True

# s 是不是 FishC 的真子集
print(s < set("FishC"))  # False
print(s < set("FishC.com.cn"))  # True

# 真超集
print(s > set("FishC"))  # False
# 超集
print(s >= set("FishC"))  # True
# 并集
print(s | {1, 2, 3} | set("Python"))  # {'s', 1, 2, 3, 'o', 'y', 'F', 'h', 'i', 'n', 'P', 't', 'C'}
# 交集
print(s & set("Php") & set("Python"))  # {'h'}
# 差集
print(s - set("Php") - set("Python"))  # {'C', 's', 'F', 'i'}
# 对称差集（^：托字符）
print(s ^ set("Python"))  # {'C', 'y', 's', 'i', 'o', 't', 'F', 'n', 'P'}

